#pragma once

#include <string>
#include <sstream>
#include "../SQLExpr.h"
#include "../SQLExprImpl.h"

class SQLASTVisitor;
class OracleASTVisitor;

class SQLMethodInvokeExpr : virtual public SQLExprImpl
{

private:
  // static long   serialVersionUID = 1L;
  string_ptr methodName;
  SQLExpr_ptr owner;
  SQLExpr_list_ptr parameters;
  SQLExpr_list_ptr arguments;
  long methodNameHashCode64_;
  SQLExpr_ptr from;
  SQLExpr_ptr using_;
  SQLExpr_ptr hasFor;
  SQLDataType_ptr resolvedReturnDataType;

public:
  static string_ptr class_;
  string_ptr trimOption;
  SQLMethodInvokeExpr();
  virtual ~SQLMethodInvokeExpr();

  SQLMethodInvokeExpr(string_ptr methodName);

  SQLMethodInvokeExpr(string_ptr methodName, SQLExpr_ptr owner);
  SHAREDOBJECT(SQLMethodInvokeExpr);

  string_ptr getMethodName();

  void setMethodName(string_ptr methodName);

  SQLExpr_ptr getOwner();

  void setOwner(SQLExpr_ptr owner);

  SQLExpr_list_ptr getParameters();

  void addArgument(SQLExpr_ptr arg);
  SQLExpr_list_ptr getArguments();

  void addParameter(SQLExpr_ptr param);

  void output(std::stringstream *buf);
  long methodNameHashCode64();

  // int hashCode();
  // BOOL_ptr equals(Object obj);

  bool containsAttribute(string_ptr name){};
  void addBeforeComment(string_list_ptr comments){};
  string_list_ptr getAfterCommentsDirect(){};
  string_list_ptr getBeforeCommentsDirect(){};
  void addAfterComment(string_ptr comment){};
  void addAfterComment(string_list_ptr comments){};
  bool hasBeforeComment(){};
  bool hasAfterComment(){};
  SQLExpr_ptr getFrom();
  void setFrom(SQLExpr_ptr x);
  SQLExpr_ptr getUsing();
  void setUsing(SQLExpr_ptr x);
  SQLExpr_ptr getFor();
  void setFor(SQLExpr_ptr x);
  SQLDataType_ptr getResolvedReturnDataType();
  void setResolvedReturnDataType(SQLDataType_ptr resolvedReturnDataType);
  void cloneTo(SQLMethodInvokeExpr_ptr x);
  void setTrimOption(string_ptr trimOption);
  string_ptr getTrimOption();

protected:
  void accept0(SQLASTVisitor_ptr visitor);
  void accept0(std::shared_ptr<OracleASTVisitor> visitor);
};
